<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>不向后兼容的变更</title>
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-base.css" />
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-medium.css" />

 </head>
 <body class="docs"><div class="navbar navbar-fixed-top">
  <div class="navbar-inner clearfix">
    <ul class="nav" style="width: 100%">
      <li style="float: left;"><a href="migration70.html">« 从 PHP 5.6.x 移植到 PHP 7.0.x</a></li>
      <li style="float: right;"><a href="migration70.new-features.html">新特性 »</a></li>
    </ul>
  </div>
</div>
<div id="breadcrumbs" class="clearfix">
  <ul class="breadcrumbs-container">
    <li><a href="index.html">PHP Manual</a></li>
    <li><a href="migration70.html">从 PHP 5.6.x 移植到 PHP 7.0.x</a></li>
    <li>不向后兼容的变更</li>
  </ul>
</div>
<div id="layout">
  <div id="layout-content"><div id="migration70.incompatible" class="sect1">
 <h2 class="title">不向后兼容的变更</h2>

 




<div class="sect2" id="migration70.incompatible.error-handling">
 <h3 class="title">错误和异常处理相关的变更</h3>

 <p class="para">
  在 PHP 7 中，很多致命错误以及可恢复的致命错误，都被转换为异常来处理了。
  这些异常继承自 <span class="classname"><a href="class.error.html" class="classname">Error</a></span> 类，此类实现了 
  <span class="classname"><a href="class.throwable.html" class="classname">Throwable</a></span> 接口
  （所有异常都实现了这个基础接口）。
 </p>

 <p class="para">
  这也意味着，当发生错误的时候，以前代码中的一些错误处理的代码将无法被触发。
  因为在 PHP 7 版本中，已经使用抛出异常的错误处理机制了。
  （如果代码中没有捕获 <span class="classname"><a href="class.error.html" class="classname">Error</a></span> 异常，那么会引发致命错误）。
 </p>

 <p class="para">
  PHP 7 中的错误处理的更完整的描述，请参见
  <a href="language.errors.php7.html" class="link">PHP 7 错误处理</a>。
  本迁移指导主要是列出对兼容性有影响的变更。
 </p>

 <div class="sect3" id="migration70.incompatible.error-handling.set-exception-handler">
  <h4 class="title">
   <span class="function"><a href="function.set-exception-handler.html" class="function">set_exception_handler()</a></span> 不再保证收到的一定是 <span class="classname"><a href="class.exception.html" class="classname">Exception</a></span> 对象
  </h4>

  <p class="para">
   抛出 <span class="classname"><a href="class.error.html" class="classname">Error</a></span> 对象时，如果 <span class="function"><a href="function.set-exception-handler.html" class="function">set_exception_handler()</a></span> 里的异常处理代码声明了类型 <span class="classname"><a href="class.exception.html" class="classname">Exception</a></span> ，将会导致 fatal error。
  </p>

  <p class="para">
   想要异常处理器同时支持 PHP5 和 PHP7，应该删掉异常处理器里的类型声明。如果代码仅仅是升级到 PHP7，则可以把类型 <span class="classname"><a href="class.exception.html" class="classname">Exception</a></span>  替换成 <span class="classname"><a href="class.throwable.html" class="classname">Throwable</a></span>。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;PHP&nbsp;5&nbsp;时代的代码将会出现问题<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Exception&nbsp;$e</span><span style="color: #007700">)&nbsp;{&nbsp;...&nbsp;}<br /></span><span style="color: #0000BB">set_exception_handler</span><span style="color: #007700">(</span><span style="color: #DD0000">'handler'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">//&nbsp;兼容&nbsp;PHP&nbsp;5&nbsp;和&nbsp;7<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">)&nbsp;{&nbsp;...&nbsp;}<br /><br /></span><span style="color: #FF8000">//&nbsp;仅支持&nbsp;PHP&nbsp;7<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Throwable&nbsp;$e</span><span style="color: #007700">)&nbsp;{&nbsp;...&nbsp;}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
 </div>
 
 <div class="sect3" id="migration70.incompatible.error-handling.constructors">
  <h4 class="title">当内部构造器失败的时候，总是抛出异常</h4>

  <p class="para">
   在之前版本中，如果内部类的构造器出错，会返回 <strong><code>null</code></strong> 
   或者一个不可用的对象。
   从 PHP 7 开始，如果内部类构造器发生错误，
   那么会抛出异常。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.parse">
  <h4 class="title">解析错误会抛出 <span class="classname"><a href="class.parseerror.html" class="classname">ParseError</a></span> 异常</h4>

  <p class="para">
   解析错误会抛出 <span class="classname"><a href="class.parseerror.html" class="classname">ParseError</a></span> 异常。
   对于 <span class="function"><a href="function.eval.html" class="function">eval()</a></span> 函数，需要将其包含到一个
   <a href="" class="link"><code class="literal">catch</code></a> 代码块中来处理解析错误。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.strict">
  <h4 class="title">E_STRICT 警告级别变更</h4>

  <p class="para">
   原有的 <strong><code>E_STRICT</code></strong> 警告都被迁移到其他级别。
   <strong><code>E_STRICT</code></strong> 常量会被保留，所以调用 
   <code class="literal">error_reporting(E_ALL|E_STRICT)</code> 不会引发错误。
  </p>
  <p class="para">
   <table class="doctable table">
    <caption><strong><strong><code>E_STRICT</code></strong> 警告级别变更</strong></caption>
     
      <thead>
       <tr>
        <th>场景</th>
        <th>新的级别/行为</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td>将资源类型的变量用作键来进行索引</td>
        <td><strong><code>E_NOTICE</code></strong></td>
       </tr>

       <tr>
        <td>抽象静态方法</td>
        <td>不再警告，会引发错误</td>
       </tr>

       <tr>
        <td>重复定义构造器函数</td>
        <td>不再警告，会引发错误</td>
       </tr>

       <tr>
        <td>在继承的时候，方法签名不匹配</td>
        <td><strong><code>E_WARNING</code></strong></td>
       </tr>

       <tr>
        <td>在两个 trait 中包含相同的（兼容的）属性</td>
        <td>不再警告，会引发错误</td>
       </tr>

       <tr>
        <td>以非静态调用的方式访问静态属性</td>
        <td><strong><code>E_NOTICE</code></strong></td>
       </tr>

       <tr>
        <td>变量应该以引用的方式赋值</td>
        <td><strong><code>E_NOTICE</code></strong></td>
       </tr>

       <tr>
        <td>变量应该以引用的方式传递（到函数参数中）</td>
        <td><strong><code>E_NOTICE</code></strong></td>
       </tr>

       <tr>
        <td>以静态方式调用实例方法</td>
        <td><strong><code>E_DEPRECATED</code></strong></td>
       </tr>

      </tbody>
     
    </table>

   </p>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.variable-handling">
 <h3 class="title">关于变量处理的变化</h3>

 <p class="para">
  PHP 7 现在使用了抽象语法树来解析源代码。这使得许多由于之前的PHP的解释器的限制所不可能实现的改进得以实现。
  但出于一致性的原因导致了一些特殊例子的变动，而这些变动打破了向后兼容。
  在这一章中将详细介绍这些例子。
 </p>

 <div class="sect3" id="migration70.incompatible.variable-handling.indirect">
  <h4 class="title">
   关于间接使用变量、属性和方法的变化
  </h4>

  <p class="para">
   对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析，而不是之前的混杂着几个特殊案例的情况。
   下面这张表说明了这个解析顺序的变化。
  </p>

  <p class="para">
   <table class="doctable table">
    <caption><strong>间接调用的表达式的新旧解析顺序</strong></caption>
    
     <thead>
      <tr>
       <th>表达式</th>
       <th>PHP 5 的解析方式</th>
       <th>PHP 7 的解析方式</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>
        <code class="code">$$foo[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">${$foo[&#039;bar&#039;][&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($$foo)[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">Foo::$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">Foo::{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">(Foo::$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>

  <p class="para">
   使用了旧的从右到左的解析顺序的代码必须被重写，明确的使用大括号来表明顺序（参见上表中间一列）。
   这样使得代码既保持了与PHP 7.x的前向兼容性，又保持了与PHP 5.x的后向兼容性。
  </p>
  
  <p class="para">
   这同样影响了 <a href="language.variables.scope.html#language.variables.scope.global" class="link"><code class="literal">global</code></a> 关键字。如果需要的话可以使用大括号来模拟之前的行为。
  </p>
  
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Valid&nbsp;in&nbsp;PHP&nbsp;5&nbsp;only.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">global&nbsp;$</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Valid&nbsp;in&nbsp;PHP&nbsp;5&nbsp;and&nbsp;7.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">global&nbsp;${</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">};<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.list">
  <h4 class="title">关于<span class="function"><a href="function.list.html" class="function">list()</a></span>处理方式的变更</h4>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.order">
   <h5 class="title">
    <span class="function"><a href="function.list.html" class="function">list()</a></span> 不再以反向的顺序来进行赋值
   </h5>

   <p class="para">
    <span class="function"><a href="function.list.html" class="function">list()</a></span> 现在会按照变量定义的顺序来给他们进行赋值，而非反过来的顺序。
    通常来说，这只会影响<span class="function"><a href="function.list.html" class="function">list()</a></span> 与数组的<code class="code">[]</code>操作符一起使用的案例，如下所示：
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">list(</span><span style="color: #0000BB">$a</span><span style="color: #007700">[],&nbsp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">[],&nbsp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">[])&nbsp;=&nbsp;[</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
    </div>

    <p class="para">以上例程在 PHP 5 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(3)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(1)
}
</pre></div>
    </div>
    <p class="para">以上例程在 PHP 7 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(3)
}
</pre></div>
    </div>
   </div>

   <p class="para">
    总之，我们推荐不要依赖<span class="function"><a href="function.list.html" class="function">list()</a></span>的赋值顺序，因为这是一个在未来也许会变更的实现细节。
   </p>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.empty">
   <h5 class="title">空的<span class="function"><a href="function.list.html" class="function">list()</a></span>赋值支持已经被移除</h5>

   <p class="para">
    <span class="function"><a href="function.list.html" class="function">list()</a></span> 结构现在不再能是空的。如下的例子不再被允许：
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">list()&nbsp;=&nbsp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(,,)&nbsp;=&nbsp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(</span><span style="color: #0000BB">$x</span><span style="color: #007700">,&nbsp;list(),&nbsp;</span><span style="color: #0000BB">$y</span><span style="color: #007700">)&nbsp;=&nbsp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
    </div>

   </div>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.string">
   <h5 class="title"><span class="function"><a href="function.list.html" class="function">list()</a></span>不再能解开<span class="type">string</span></h5>

   <p class="para">
    <span class="function"><a href="function.list.html" class="function">list()</a></span> 不再能解开字符串（<span class="type">string</span>）变量。
    你可以使用<span class="function"><a href="function.str-split.html" class="function">str_split()</a></span>来代替它。
   </p>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.array-order">
  <h4 class="title">
   Array ordering when elements are automatically created during by reference
   assignments has changed
  </h4>

  <p class="para">
   The order of the elements in an array has changed when those elements have
   been automatically created by referencing them in a by reference
   assignment. For example:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$array&nbsp;</span><span style="color: #007700">=&nbsp;[];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"a"</span><span style="color: #007700">]&nbsp;=&amp;&nbsp;</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;b&quot;]=&gt;
  &amp;int(1)
  [&quot;a&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;a&quot;]=&gt;
  &amp;int(1)
  [&quot;b&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.parentheses">
  <h4 class="title">
   函数参数附近的括号不再影响行为
  </h4>

  <p class="para">
   在 PHP 5中，在以引用方式传递函数参数时，使用冗余的括号对可以隐匿严格标准
   的警告。现在，这个警告总会触发。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">getArray</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">];<br />}<br /><br />function&nbsp;</span><span style="color: #0000BB">squareArray</span><span style="color: #007700">(array&nbsp;&amp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(</span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">as&nbsp;&amp;</span><span style="color: #0000BB">$v</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$v&nbsp;</span><span style="color: #007700">**=&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #FF8000">//&nbsp;Generates&nbsp;a&nbsp;warning&nbsp;in&nbsp;PHP&nbsp;7.<br /></span><span style="color: #0000BB">squareArray</span><span style="color: #007700">((</span><span style="color: #0000BB">getArray</span><span style="color: #007700">()));<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程会输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
</pre></div>
   </div>
  </div>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.foreach">
 <h3 class="title"> <a href="control-structures.foreach.html" class="link">foreach</a>的变化</h3>

 <p class="para">
  <a href="control-structures.foreach.html" class="link">foreach</a>发生了细微的变化，控制结构， 主要围绕阵列的内部数组指针和迭代处理的修改。

 </p>

 <div class="sect3" id="migration70.incompatible.foreach.array-pointer">
  <h4 class="title"><a href="control-structures.foreach.html" class="link">foreach</a>不再改变内部数组指针</h4>

  <p class="para">
   在PHP7之前，当数组通过 <a href="control-structures.foreach.html" class="link">foreach</a> 迭代时，数组指针会移动。现在开始，不再如此，见下面代码
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$array&nbsp;</span><span style="color: #007700">=&nbsp;[</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">];<br />foreach&nbsp;(</span><span style="color: #0000BB">$array&nbsp;</span><span style="color: #007700">as&nbsp;&amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">current</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">));<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(1)
int(2)
bool(false)
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(0)
int(0)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-value">
  <h4 class="title"><a href="control-structures.foreach.html" class="link">foreach</a> 通过值遍历时，操作的值为数组的副本</h4>

  <p class="para">
   当默认使用通过值遍历数组时，<a href="control-structures.foreach.html" class="link">foreach</a> 实际操作的是数组的迭代副本，而非数组本身。这就意味着，foreach 中的操作不会修改原数组的值。   
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-ref">
  <h4 class="title"><a href="control-structures.foreach.html" class="link">foreach</a>通过引用遍历时，有更好的迭代特性</h4>

  <p class="para">
   当使用引用遍历数组时，现在 <a href="control-structures.foreach.html" class="link">foreach</a> 在迭代中能更好的跟踪变化。例如，在迭代中添加一个迭代值到数组中，参考下面的代码：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$array&nbsp;</span><span style="color: #007700">=&nbsp;[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br />foreach&nbsp;(</span><span style="color: #0000BB">$array&nbsp;</span><span style="color: #007700">as&nbsp;&amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(1)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.object">
  <h4 class="title"> 非<span class="classname"><a href="class.traversable.html" class="classname">Traversable</a></span> 对象的遍历</h4>

  <p class="para">
   迭代一个非<span class="classname"><a href="class.traversable.html" class="classname">Traversable</a></span>对象将会与迭代一个引用数组的行为相同。
   这将导致在对象添加或删除属性时，<a href="migration70.incompatible.html#migration70.incompatible.foreach.by-ref" class="link"><a href="control-structures.foreach.html" class="link">foreach</a>通过引用遍历时，有更好的迭代特性</a>也能被应用
  </p>
 </div>
</div>



 



<div class="sect2" id="migration70.incompatible.integers">
 <h3 class="title"><span class="type">int</span> 处理更改</h3>

 <div class="sect3" id="migration70.incompatible.integers.invalid-octals">
  <h4 class="title">无效的八进制字符（Invalid octal literals）</h4>

  <p class="para">
   在之前，一个八进制字符如果含有无效数字，该无效数字将被静默删节(<code class="literal">0128</code> 将被解析为 <code class="literal">012</code>).
   现在这样的八进制字符将产生解析错误。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.negative-bitshift">
  <h4 class="title">负位移运算（Negative bitshifts）</h4>

  <p class="para">
   以负数形式进行的位移运算将会抛出一个
   <span class="classname"><a href="class.arithmeticerror.html" class="classname">ArithmeticError</a></span>：
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">&gt;&gt;&nbsp;-</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

    <p class="para">以上例程在 PHP 5 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
    </div>
    <p class="para">以上例程在 PHP 7 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
  thrown in /tmp/test.php on line 2
</pre></div>
    </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.out-of-range">
  <h4 class="title">超范围后产生位移</h4>

  <p class="para">
   超出 <span class="type">int</span> 位宽的位移操作（无论哪个方向）将始终得到 0 作为结果。在从前，这一操作是结构依赖的。
  </p>
 </div>


 <div class="sect3" id="migration70.incompatible.integers.div-by-zero">
  <h4 class="title">除以零的变化</h4>

  <p class="para">
   之前的版本中，当 0 被做为除数时，无论是除数 (/) 或取模 (%) 操作，都会抛出一个 E_WARNING 错误并返回
   <strong><code>false</code></strong>。现在，除法运算符 (/) 会返回一个由 IEEE 754 指定的浮点数：+INF, -INF 或 NAN。取模操作符
   (%) 则会抛出一个 <span class="classname"><a href="class.divisionbyzeroerror.html" class="classname">DivisionByZeroError</a></span> 异常，并且不再产生 E_WARNING 错误。
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">3</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">%</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d
</pre></div>
   </div>
  </div>
 </div>
</div>



 



<div class="sect2" id="migration70.incompatible.strings">
 <h3 class="title"><span class="type">string</span>处理上的调整</h3>

 <div class="sect3" id="migration70.incompatible.strings.hex">
  <h4 class="title">十六进制字符串不再被认为是数字</h4>

  <p class="para">
   含十六进制字符串不再被认为是数字。例如：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0x123"&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">"291"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">is_numeric</span><span style="color: #007700">(</span><span style="color: #DD0000">"0x123"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0xe"&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
bool(true)
bool(true)
int(15)
string(2) &quot;oo&quot;
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
bool(false)
bool(false)
int(0)

Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) &quot;foo&quot;
</pre></div>
   </div>
  </div>

  <p class="para">
   <span class="function"><a href="function.filter-var.html" class="function">filter_var()</a></span> 函数可以用于检查一个
   <span class="type">string</span> 是否含有十六进制数字,并将其转换为 <span class="type">int</span>：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$str&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"0xffff"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$int&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">filter_var</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">FILTER_VALIDATE_INT</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">FILTER_FLAG_ALLOW_HEX</span><span style="color: #007700">);<br />if&nbsp;(</span><span style="color: #0000BB">false&nbsp;</span><span style="color: #007700">===&nbsp;</span><span style="color: #0000BB">$int</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;</span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">"Invalid&nbsp;integer!"</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$int</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;int(65535)<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.strings.unicode-escapes">
  <h4 class="title"><code class="literal">\u{</code> 可能引起错误</h4>

  <p class="para">
   由于新的
   <a href="migration70.new-features.html#migration70.new-features.unicode-codepoint-escape-syntax" class="link">Unicode codepoint 转义语法</a>，
   紧连着无效序列并包含<code class="literal">\u{</code> 的字串可能引起致命错误。 为了避免这一报错，应该避免反斜杠开头。
  </p>
 </div>
</div>



 



<div class="sect2" id="migration70.incompatible.removed-functions">
 <h3 class="title">被移除的函数（Removed functions）</h3>

 <div class="sect3" id="migration70.incompatible.removed-functions.call-user-method">
  <h4 class="title">
   <span class="function"><strong>call_user_method()</strong></span> and
   <span class="function"><strong>call_user_method_array()</strong></span>
  </h4>

  <p class="para">
   这两个函数从PHP 4.1.0 开始被废弃，应该使用
   <span class="function"><a href="function.call-user-func.html" class="function">call_user_func()</a></span> 和
   <span class="function"><a href="function.call-user-func-array.html" class="function">call_user_func_array()</a></span>。 你也可以考虑使用
   <a href="functions.variable-functions.html" class="link">变量函数</a>
   或者
   <a href="functions.arguments.html#functions.variable-arg-list" class="link"><code class="literal">...</code></a>
   操作符。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.removed-functions.ereg">
  <h4 class="title">
   所有的 ereg* 函数
  </h4>
  <p class="para">
   所有 <code class="literal">ereg</code> 系列函数被删掉了。
   <a href="book.pcre.html" class="link">PCRE</a> 作为推荐的替代品。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mcrypt">
  <h4 class="title"><a href="book.mcrypt.html" class="link">mcrypt</a> 别名</h4>

  <p class="para">
   已废弃的 <span class="function"><strong>mcrypt_generic_end()</strong></span> 函数已被移除，请使用<span class="function"><a href="function.mcrypt-generic-deinit.html" class="function">mcrypt_generic_deinit()</a></span>代替。
  </p>

  <p class="para">
   此外，已废弃的 <span class="function"><strong>mcrypt_ecb()</strong></span>,
   <span class="function"><strong>mcrypt_cbc()</strong></span>, <span class="function"><strong>mcrypt_cfb()</strong></span> 和
   <span class="function"><strong>mcrypt_ofb()</strong></span> 函数已被移除，请配合恰当的<strong><code>MCRYPT_MODE_*</code></strong> 常量来使用 <span class="function"><a href="function.mcrypt-decrypt.html" class="function">mcrypt_decrypt()</a></span>进行代替。
   
  </p>
 </div>

 
 <div class="sect3" id="migration70.incompatible.removed-functions.mysql">
  <h4 class="title">
   所有 ext/mysql 函数
  </h4>
  <p class="para">
   所有 <a href="book.mysql.html" class="link">ext/mysql</a> 函数已被删掉了。
   如何选择不同的 MySQL API，详情请见
   <a href="mysqlinfo.api.choosing.html" class="link">选择 MySQL API</a>。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mssql">
  <h4 class="title">
   所有 ext/mssql 函数
  </h4>
  <p class="para">
   所有 <a href="" class="link">ext/mssql</a> 函数已被移除。
   <ul class="simplelist">
    <li class="member"><a href="ref.pdo-sqlsrv.html" class="link">PDO_SQLSRV</a></li>
    <li class="member"><a href="ref.pdo-odbc.html" class="link">PDO_ODBC</a></li>
    <li class="member"><a href="book.sqlsrv.html" class="link">SQLSRV</a></li>
    <li class="member"><a href="book.uodbc.html" class="link">Unified ODBC API</a></li>
   </ul>
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.removed-functions.intl">
  <h4 class="title"><a href="book.intl.html" class="link">intl</a> 别名</h4>

  <p class="para">
   已废弃的 <span class="function"><strong>datefmt_set_timezone_id()</strong></span> 和
   <span class="methodname"><strong>IntlDateFormatter::setTimeZoneID()</strong></span> 函数已被移除，请使用 <span class="function"><a href="intldateformatter.settimezone.html" class="function">datefmt_set_timezone()</a></span> 与
   <span class="methodname"><a href="intldateformatter.settimezone.html" class="methodname">IntlDateFormatter::setTimeZone()</a></span>代替。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.magic-quotes">
  <h4 class="title"><span class="function"><strong>set_magic_quotes_runtime()</strong></span></h4>

  <p class="para">
   移除了 <span class="function"><strong>set_magic_quotes_runtime()</strong></span> 和它的别名
   <span class="function"><strong>magic_quotes_runtime()</strong></span>。 它们在 PHP 5.3.0 中已经被废弃，
   并由于 PHP 5.4.0 移除魔术引号（Magic Quotes）而没有用处。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.set-socket-blocking">
  <h4 class="title"><span class="function"><strong>set_socket_blocking()</strong></span></h4>

  <p class="para">
   已废弃的 <span class="function"><strong>set_socket_blocking()</strong></span>  函数已被移除，请使用<span class="function"><a href="function.stream-set-blocking.html" class="function">stream_set_blocking()</a></span>代替。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.dl">
  <h4 class="title"><span class="function"><a href="function.dl.html" class="function">dl()</a></span> in PHP-FPM</h4>

  <p class="para">
   <span class="function"><a href="function.dl.html" class="function">dl()</a></span>在 PHP-FPM 不再可用，在 CLI 和 embed SAPIs 中仍可用。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.gd">
  <h4 class="title"><a href="book.image.html" class="link">GD</a> Type1 functions</h4>

  <p class="para">
   Support for PostScript Type1 fonts has been removed from the GD extension,
   resulting in the removal of the following functions:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsbbox()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsencodefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsextendfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsfreefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsloadfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsslantfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepstext()</strong></span>
    </span>
   </li>
  </ul>

  <p class="para">
   推荐使用 TrueType 字体和相关的函数作为替代。
  </p>
 </div>
</div>



 



<div class="sect2" id="migration70.incompatible.removed-ini-directives">
 <h3 class="title">被移除掉的 INI 配置指令</h3>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.features">
  <h4 class="title">被移除的功能</h4>

  <p class="para">
   以下 INI 配置指令已经被移除，同时移除的还有其对应的功能
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">always_populate_raw_post_data</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">asp_tags</code>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.xsl">
  <h4 class="title"><code class="parameter">xsl.security_prefs</code></h4>

  <p class="para">
   <code class="parameter">xsl.security_prefs</code> 指令被移除
   在预处理的时候，取而代之的方法 <span class="methodname"><a href="xsltprocessor.setsecurityprefs.html" class="methodname">XsltProcessor::setSecurityPrefs()</a></span>
   应该被调用到
  </p>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.other">
 <h3 class="title">其他向后兼容相关的变更</h3>

 <div class="sect3" id="migration70.incompatible.other.new-by-ref">
  <h4 class="title">new 操作符创建的对象不能以引用方式赋值给变量</h4>

  <p class="para">
   <a href="language.oop5.basic.html#language.oop5.basic.new" class="link"><code class="literal">new</code></a> 语句创建的对象不能
   以引用的方式赋值给变量。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">C&nbsp;</span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">$c&nbsp;</span><span style="color: #007700">=&amp;&nbsp;new&nbsp;</span><span style="color: #0000BB">C</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Parse error: syntax error, unexpected &#039;new&#039; (T_NEW) in /tmp/test.php on line 3
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.classes">
  <h4 class="title">无效的类、接口以及 trait 命名</h4>

  <p class="para">
   不能以下列名字来命名类、接口以及 trait：
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type">bool</span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type">int</span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type">float</span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type">string</span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>null</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>true</code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code>false</code></strong></span>
   </li>
  </ul>

  <p class="para">
   此外，也不要使用下列的名字来命名类、接口以及 trait。虽然在 PHP 7.0 中，
   这并不会引发错误，
   但是这些名字是保留给将来使用的。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type">resource</span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type">object</span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.declarations.html#language.types.declarations.mixed" class="type mixed">mixed</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><span class="type numeric">numeric</span></span></span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.other.php-tags">
  <h4 class="title">移除了 ASP 和 script PHP 标签</h4>

  <p class="para">
   使用类似 ASP 的标签，以及 script 标签来区分 PHP 代码的方式被移除。
   受到影响的标签有：
  </p>

  <table class="doctable table">
   <caption><strong>被移除的 ASP 和 script 标签</strong></caption>
   
    <thead>
     <tr>
      <th>开标签</th>
      <th>闭标签</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td><code class="code">&lt;%</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;%=</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;script language=&quot;php&quot;&gt;</code></td>
      <td><code class="code">&lt;/script&gt;</code></td>
     </tr>

    </tbody>
   
  </table>

 </div>

 <div class="sect3" id="migration70.incompatible.other.incompatible-this">
  <h4 class="title">从不匹配的上下文发起调用</h4>

  <p class="para">
   在不匹配的上下文中以静态方式调用非静态方法，
   <a href="migration56.deprecated.html#migration56.deprecated.incompatible-context" class="link">在 PHP 5.6 中已经废弃</a>，
   但是在 PHP 7.0 中，
   会导致被调用方法中未定义 <code class="literal">$this</code> 变量，以及此行为已经废弃的警告。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">A&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">test</span><span style="color: #007700">()&nbsp;{&nbsp;</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);&nbsp;}<br />}<br /><br /></span><span style="color: #FF8000">//&nbsp;注意：并没有从类&nbsp;A&nbsp;继承<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">B&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">()&nbsp;{&nbsp;</span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">test</span><span style="color: #007700">();&nbsp;}<br />}<br /><br />(new&nbsp;</span><span style="color: #0000BB">B</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5.6 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8

Notice: Undefined variable: this in /tmp/test.php on line 3
NULL
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.yield">
  <h4 class="title"><a href="language.generators.syntax.html#control-structures.yield" class="link">yield</a> 变更为右联接运算符</h4>

  <p class="para">
   在使用 <a href="language.generators.syntax.html#control-structures.yield" class="link">yield</a> 关键字的时候，不再需要括号，
   并且它变更为右联接操作符，其运算符优先级介于
   <code class="literal">print</code> 和 <code class="literal">=&gt;</code> 之间。
   这可能导致现有代码的行为发生改变：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo&nbsp;yield&nbsp;-</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">//&nbsp;在之前版本中会被解释为：<br /></span><span style="color: #007700">echo&nbsp;(yield)&nbsp;-&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">//&nbsp;现在，它将被解释为：<br /></span><span style="color: #007700">echo&nbsp;yield&nbsp;(-</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />yield&nbsp;</span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">or&nbsp;die;<br /></span><span style="color: #FF8000">//&nbsp;在之前版本中会被解释为：<br /></span><span style="color: #007700">yield&nbsp;(</span><span style="color: #0000BB">$foo&nbsp;</span><span style="color: #007700">or&nbsp;die);<br /></span><span style="color: #FF8000">//&nbsp;现在，它将被解释为：<br /></span><span style="color: #007700">(yield&nbsp;</span><span style="color: #0000BB">$foo</span><span style="color: #007700">)&nbsp;or&nbsp;die;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>

  <p class="para">
   可以通过使用括号来消除歧义。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.func-parameters">
  <h4 class="title">函数定义不可以包含多个同名参数</h4>

  <p class="para">
   在函数定义中，不可以包含两个或多个同名的参数。
   例如，下面代码中的函数定义会触发
   <strong><code>E_COMPILE_ERROR</code></strong> 错误：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$b</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$unused</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$unused</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.multiple-default">
  <h4 class="title">Switch 语句不可以包含多个 default 块</h4>

  <p class="para">
   在 switch 语句中，两个或者多个 default 块的代码已经不再被支持。
   例如，下面代码中的 switch 语句会触发
   <strong><code>E_COMPILE_ERROR</code></strong> 错误：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">switch&nbsp;(</span><span style="color: #0000BB">1</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.func-parameter-modified">
  <h4 class="title">在函数中检视参数值会返回 <em class="emphasis">当前</em> 的值</h4>

  <p class="para">
   当在函数代码中使用 <span class="function"><a href="function.func-get-arg.html" class="function">func_get_arg()</a></span> 或 
   <span class="function"><a href="function.func-get-args.html" class="function">func_get_args()</a></span> 函数来检视参数值，
   或者使用 <span class="function"><a href="function.debug-backtrace.html" class="function">debug_backtrace()</a></span> 函数查看回溯跟踪，
   以及在异常回溯中所报告的参数值是指参数当前的值（有可能是已经被函数内的代码改变过的值），
   而不再是参数被传入函数时候的原始值了。
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$x</span><span style="color: #007700">++;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">func_get_arg</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">));<br />}<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);</span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

   <p class="para">以上例程在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
</pre></div>
   </div>
   <p class="para">以上例程在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
2
</pre></div>
   </div>
  </div>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.http-raw-post-data">
  <h4 class="title"><var class="varname">$HTTP_RAW_POST_DATA</var> 被移除</h4>

  <p class="para">
   不再提供 <var class="varname">$HTTP_RAW_POST_DATA</var> 变量。 请使用
   <a href="wrappers.php.html#wrappers.php.input" class="link"><code class="literal">php://input</code></a>
   作为替代。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.ini-comments">
  <h4 class="title">INI 文件中 <code class="literal">#</code> 注释格式被移除</h4>

  <p class="para">
   在 INI 文件中，不再支持以 <code class="literal">#</code> 开始的注释行，
   请使用 <code class="literal">;</code>（分号）来表示注释。
   此变更适用于 <var class="filename">php.ini</var> 以及用 <span class="function"><a href="function.parse-ini-file.html" class="function">parse_ini_file()</a></span> 和 <span class="function"><a href="function.parse-ini-string.html" class="function">parse_ini_string()</a></span>
   函数来处理的文件。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.json-to-jsond">
  <h4 class="title">JSON 扩展已经被 JSOND 取代</h4>

  <p class="para">
   JSON 扩展已经被 JSOND 扩展取代。
   对于数值的处理，有以下两点需要注意的：
   第一，数值不能以点号（.）结束
   （例如，数值 <code class="literal">34.</code> 必须写作 
   <code class="literal">34.0</code> 或 <code class="literal">34</code>）。
   第二，如果使用科学计数法表示数值，<code class="literal">e</code> 前面必须不是点号（.）
   （例如，<code class="literal">3.e3</code> 必须写作
   <code class="literal">3.0e3</code> 或 <code class="literal">3e3</code>）。
   另外，空字符串不再被视作有效的 JSON 字符串。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.internal-function-failure-overflow">
  <h4 class="title">在数值溢出的时候，内部函数将会失败</h4>

  <p class="para">
   将浮点数转换为整数的时候，如果浮点数值太大，导致无法以整数表达的情况下，
   在之前的版本中，内部函数会直接将整数截断，并不会引发错误。
   在 PHP 7.0 中，如果发生这种情况，会引发 E_WARNING 错误，并且返回 <strong><code>null</code></strong>。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.fixes-custom-session-handler">
  <h4 class="title">自定义会话处理器的返回值修复</h4>

  <p class="para">
   在自定义会话处理器中，如果函数的返回值不是 <strong><code>false</code></strong>，也不是 <code class="literal">-1</code>，
   会引发致命错误。现在，如果这些函数的返回值不是布尔值，也不是 <code class="literal">-1</code> 
   或者 <code class="literal">0</code>，函数调用结果将被视为失败，并且引发 E_WARNING 错误。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.sort-order">
  <h4 class="title">相等的元素在排序时的顺序问题</h4>
  <p class="para">
   由于内部排序算法进行了提升，
   可能会导致对比时被视为相等的多个元素之间的顺序不稳定。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    在对比时被视为相等的多个元素之间的排序顺序是不可信赖的，即使是相等的两个元素，
    他们的位置也可能被排序算法所改变。
   </p>
  </p></blockquote>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.break-continue">
  <h4 class="title">错误的使用 break 和 switch 语句</h4>
  <p class="para">
   在循环或者 <code class="literal">switch</code> 语句之外使用
   <code class="literal">break</code> 和 <code class="literal">continue</code> 
   被视为编译型错误（之前视为运行时错误），会引发
   <strong><code>E_COMPILE_ERROR</code></strong> 错误。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.mhash">
  <h4 class="title">Mhash 不再是一个单独的扩展了</h4>
  <p class="para">
   Mhash 扩展已经被完全整合进 <a href="book.hash.html" class="link">Hash</a> 扩展了。
   因此，不要再使用 <span class="function"><a href="function.extension-loaded.html" class="function">extension_loaded()</a></span> 函数来检测是否支持 MHash 扩展了，
   建议使用 <span class="function"><a href="function.function-exists.html" class="function">function_exists()</a></span> 函数来进行检测。
   另外，函数 <span class="function"><a href="function.get-loaded-extensions.html" class="function">get_loaded_extensions()</a></span> 以及相关的特性中，也不再报告
   和 MHash 扩展相关的信息了。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.declare-ticks">
  <h4 class="title">declare(ticks)</h4>
  <p class="para">
   <a href="control-structures.declare.html#control-structures.declare.ticks" class="link">declare(ticks)</a>
   指示符不再泄漏到不同的编译单元中。
  </p>
 </div>
</div>



</div></div></div></body></html>